home *** CD-ROM | disk | FTP | other *** search
/ The Mac Mega CD - Killer Software / The Mac Mega CD - Killer Software (May 1996).dmg / Shareware City / Sound / MacMikMod 2.10+src / source / mdriver.c < prev    next >
Encoding:
C/C++ Source or Header  |  1996-01-03  |  4.2 KB  |  274 lines  |  [TEXT/CWIE]

  1. /*
  2.  
  3. Name:
  4. MDRIVER.C
  5.  
  6. Description:
  7. These routines are used to access the available soundcard drivers.
  8.  
  9. Portability:
  10. All systems - all compilers
  11.  
  12. */
  13. #include <stdio.h>
  14. #include <stdlib.h>
  15. #include "mikmod.h"
  16.  
  17. DRIVER *firstdriver=NULL,*md_driver;
  18.  
  19. UWORD md_device         =0;
  20. UWORD md_mixfreq        =44100;
  21. UWORD md_mode           =0;
  22. UWORD md_dmabufsize     =8192;
  23. UBYTE md_numchn         =0;
  24. UBYTE md_bpm            =125;
  25.  
  26. static void dummyplay(void)
  27. {
  28. }
  29.  
  30. void (*md_player)(void)=dummyplay;
  31.  
  32. static FILE *sl_fp;
  33. static SWORD sl_old;
  34. static UWORD sl_infmt;
  35. static UWORD sl_outfmt;
  36. static SWORD sl_buffer[1024];
  37.  
  38. static BOOL isplaying=0;
  39.  
  40.  
  41. void SL_Init(FILE *fp,UWORD infmt,UWORD outfmt)
  42. {
  43.     sl_old=0;
  44.     sl_fp=fp;
  45.     sl_infmt=infmt;
  46.     sl_outfmt=outfmt;
  47. }
  48.  
  49.  
  50. void SL_Exit(void)
  51. {
  52. }
  53.  
  54. #define MM_BIG_ENDIAN
  55. #define endian_switch(x)             (((((UWORD)(x)) & 0xFF00) >> 8) |         \
  56.                                           ((((UWORD)(x)) & 0xFF) << 8))
  57.  
  58. static int swab(SWORD *in_buf, long len)
  59. {
  60.     while (len--) {
  61.         endian_switch(in_buf++);
  62.     }
  63. }
  64.  
  65. void SL_Load(void *buffer, ULONG length)
  66. {
  67.     SBYTE *bptr=(SBYTE *)buffer;
  68.     SWORD *wptr=(SWORD *)buffer;
  69.     UWORD stodo;
  70.     int t;
  71.  
  72.     /* compute number of samples to load */
  73.     if(sl_outfmt & SF_16BITS) length>>=1;
  74.  
  75.     while(length){
  76.  
  77.         stodo=(length<1024) ? length : 1024;
  78.  
  79.         if(sl_infmt&SF_16BITS){
  80.             fread(sl_buffer,sizeof(SWORD),stodo,sl_fp);
  81. /* #ifdef MM_BIG_ENDIAN
  82.             if(!(sl_infmt&SF_BIG_ENDIAN))
  83.                 swab(sl_buffer, stodo<<1);
  84. #else
  85.             if(sl_infmt&SF_BIG_ENDIAN)
  86.                 swab(sl_buffer, stodo<<1);
  87. #endif */
  88.         }
  89.         else{
  90.             SBYTE *s;
  91.             SWORD *d;
  92.  
  93.             fread(sl_buffer,sizeof(SBYTE),stodo,sl_fp);
  94.  
  95.             s=(SBYTE *)sl_buffer;
  96.             d=sl_buffer;
  97.             s+=stodo;
  98.             d+=stodo;
  99.  
  100.                         for(t=0;t<stodo;t++){
  101.                 s--;
  102.                 d--;
  103.                 *d=(*s)<<8;
  104.             }
  105.         }
  106.  
  107.         if(sl_infmt & SF_DELTA){
  108.             for(t=0;t<stodo;t++){
  109.                 sl_buffer[t]+=sl_old;
  110.                 sl_old=sl_buffer[t];
  111.             }
  112.         }
  113.  
  114.         if((sl_infmt^sl_outfmt) & SF_SIGNED){
  115.             for(t=0;t<stodo;t++){
  116.                 sl_buffer[t]^=0x8000;
  117.             }
  118.         }
  119.  
  120.         if(sl_outfmt & SF_16BITS){
  121.             for(t=0;t<stodo;t++) *(wptr++)=sl_buffer[t];
  122.         }
  123.         else{
  124.             for(t=0;t<stodo;t++) *(bptr++)=sl_buffer[t]>>8;
  125.         }
  126.  
  127.         length-=stodo;
  128.     }
  129. }
  130.  
  131.  
  132. void MD_InfoDriver(void)
  133. {
  134.     int t;
  135.     DRIVER *l;
  136.  
  137.     /* list all registered devicedrivers: */
  138.  
  139.     for(t=1,l=firstdriver; l!=NULL; l=l->next, t++){
  140.         printf("%d. %s\n",t,l->Version);
  141.     }
  142. }
  143.  
  144.  
  145. void MD_RegisterDriver(DRIVER *drv)
  146. {
  147.     if(firstdriver==NULL){
  148.         firstdriver=drv;
  149.         drv->next=NULL;
  150.     }
  151.     else{
  152.         drv->next=firstdriver;
  153.         firstdriver=drv;
  154.     }
  155. }
  156.  
  157.  
  158. SWORD MD_SampleLoad(FILE *fp,ULONG size,ULONG reppos,ULONG repend,UWORD flags)
  159. {
  160.     SWORD result=md_driver->SampleLoad(fp,size,reppos,repend,flags);
  161.     SL_Exit();
  162.     return result;
  163. }
  164.  
  165.  
  166. void MD_SampleUnLoad(SWORD handle)
  167. {
  168.     md_driver->SampleUnLoad(handle);
  169. }
  170.  
  171.  
  172. BOOL MD_Init(void)
  173. {
  174.     UWORD t;
  175.  
  176.     /* if md_device==0, try to find a device number */
  177.  
  178.     if(md_device==0){
  179.  
  180.         for(t=1,md_driver=firstdriver; md_driver!=NULL; md_driver=md_driver->next, t++){
  181.             if(md_driver->IsPresent()) break;
  182.         }
  183.  
  184.         if(md_driver==NULL){
  185.             myerr="You don't have any of the supported sound-devices";
  186.             return 0;
  187.         }
  188.  
  189.         md_device=t;
  190.     }
  191.  
  192.     /* if n>0 use that driver */
  193.  
  194.     for(t=1,md_driver=firstdriver; md_driver!=NULL && t!=md_device; md_driver=md_driver->next, t++);
  195.  
  196.     if(md_driver==NULL){
  197.         myerr="Device number out of range";
  198.         return 0;
  199.     }
  200.  
  201.     return(md_driver->Init());
  202. }
  203.  
  204.  
  205. void MD_Exit(void)
  206. {
  207.     md_driver->Exit();
  208. }
  209.  
  210.  
  211. void MD_PlayStart(void)
  212. {
  213.     /* safety valve, prevents entering
  214.        playstart twice: */
  215.  
  216.     if(isplaying) return;
  217.     md_driver->PlayStart();
  218.     isplaying=1;
  219. }
  220.  
  221.  
  222. void MD_PlayStop(void)
  223. {
  224.     /* safety valve, prevents calling playStop when playstart
  225.        hasn't been called: */
  226.  
  227.     if(isplaying){
  228.         isplaying=0;
  229.         md_driver->PlayStop();
  230.     }
  231. }
  232.  
  233.  
  234. void MD_SetBPM(UBYTE bpm)
  235. {
  236.     md_bpm=bpm;
  237. }
  238.  
  239.  
  240. void MD_RegisterPlayer(void (*player)(void))
  241. {
  242.     md_player=player;
  243. }
  244.  
  245.  
  246. void MD_Update(void)
  247. {
  248.     if(isplaying) md_driver->Update();
  249. }
  250.  
  251.  
  252. void MD_VoiceSetVolume(UBYTE voice,UBYTE vol)
  253. {
  254.     md_driver->VoiceSetVolume(voice,vol);
  255. }
  256.  
  257.  
  258. void MD_VoiceSetFrequency(UBYTE voice,ULONG frq)
  259. {
  260.     md_driver->VoiceSetFrequency(voice,frq);
  261. }
  262.  
  263.  
  264. void MD_VoiceSetPanning(UBYTE voice,ULONG pan)
  265. {
  266.     md_driver->VoiceSetPanning(voice,pan);
  267. }
  268.  
  269.  
  270. void MD_VoicePlay(UBYTE voice,SWORD handle,ULONG start,ULONG size,ULONG reppos,ULONG repend,UWORD flags)
  271. {
  272.     md_driver->VoicePlay(voice,handle,start,size,reppos,repend,flags);
  273. }
  274.